/**
 * @param {number[]} nums
 * @return {number}
 */
/**
 * 思路：长度为1,2时单独算。
 * 记录[0, i]取最大值最后的一个索引位置maxPtr
 * 当数字nums[i+1]进来时更新最大值无非两种情况：
 * 1、maxPtr != i，直接相加，更新最大值。
 * 2、maxPtr = i，说明当前无法相加，取[0, i - 1]的最大值与当前数相加，和[0, i]最大值比较
 * （1）大于 更新
 * （2）小于或等于 不更新
 */
var rob = function(nums) {
    let len = nums.length;
    if(len === 0) return 0 // 长度为0，直接返回
    if(len == 1 || len == 2) return Math.max(...nums) // 长度为1或2取最大值
    let oneMax = nums[0], twoMax = nums[0], maxPtr = 0;
    if(nums[1] > nums[0]) {
        twoMax = nums[1]
        maxPtr = 1; // 更新当前区间取最大值的索引
    }
    for(let i = 2; i < nums.length; i++) {
        let temp;
        if(maxPtr === i - 1) { // 取最大值位置相邻
            if(oneMax + nums[i] > twoMax) { // 判断前面的前面的位置
                temp = oneMax
                oneMax = twoMax
                twoMax = temp + nums[i]
                maxPtr = i; // 更新取最大值指针的索引
            }
        } else { // 取最大值位置不相邻直接更新
            oneMax = twoMax
            twoMax = twoMax + nums[i];
            maxPtr = i
        }
    }
    return twoMax
};
console.log(rob([1,2,3,1]));
console.log(rob([2,7,9,3,1]));